/**
 * 通用文件下载工具函数
 * 用于处理从API返回的文件流并触发浏览器下载
 */

/**
 * 从响应头中提取文件名
 * @param contentDisposition Content-Disposition 响应头
 * @param defaultFilename 默认文件名
 * @returns 提取的文件名或默认文件名
 */
export const extractFilenameFromHeaders = (
    contentDisposition: string | null | undefined,
    defaultFilename: string
): string => {
    if (!contentDisposition) {
        return defaultFilename;
    }

    const filenameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*)\2|[^;\n]*/);
    if (filenameMatch && filenameMatch[1]) {
        return filenameMatch[1].replace(/['"]*/g, '');
    }

    return defaultFilename;
};

/**
 * 从Blob数据创建下载
 * @param blob Blob数据
 * @param filename 文件名
 */
export const downloadBlob = (blob: Blob, filename: string): void => {
    // 创建Blob URL
    const url = window.URL.createObjectURL(blob);

    // 创建一个隐藏的a标签触发下载
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    a.download = filename;

    // 添加到body并触发点击
    document.body.appendChild(a);
    a.click();

    // 清理
    window.URL.revokeObjectURL(url);
    document.body.removeChild(a);
};

/**
 * 处理API返回的文件流并触发下载
 * @param response Axios响应对象
 * @param defaultFilename 默认文件名
 */
export const handleFileDownload = (
    response: any,
    defaultFilename: string = 'download.xlsx'
): void => {
    // 从响应头中获取文件名
    const contentDisposition = response.headers['content-disposition'];
    const filename = extractFilenameFromHeaders(contentDisposition, defaultFilename);

    // 获取内容类型
    const contentType = response.headers['content-type'] || 'application/octet-stream';

    // 创建Blob对象
    const blob = new Blob([response.data], { type: contentType });

    // 触发下载
    downloadBlob(blob, filename);
};

/**
 * 创建带时间戳的文件名
 * @param baseName 基础文件名（不含扩展名）
 * @param extension 文件扩展名（包含点，如 '.xlsx'）
 * @returns 带时间戳的文件名
 */
export const createTimestampedFilename = (baseName: string, extension: string): string => {
    const timestamp = new Date().toISOString().split('T')[0];
    return `${baseName}_${timestamp}${extension}`;
};
